use agent::generic::ProviderConfig;
use dotenvy::dotenv;
use learn::init_logger;
use learn::learn::html_processor::create_html_folder_processor;
use std::env;
use std::fs;
use std::path::{Path, PathBuf};
use common::compose::make_empty_ctx;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 加载环境变量
    dotenv().ok();
    
    // 初始化日志系统
    init_logger();


    // 检查API密钥
    if env::var("GEMINI_API_KEY").is_err() {
        println!("请设置 GEMINI_API_KEY 环境变量");
        return Ok(());
    }

    // 获取API密钥
    let api_key = env::var("GEMINI_API_KEY").unwrap();
    let base_url = env::var("GEMINI_BASE_URL").ok();

    // 使用真实的resources/csug目录作为输入
    let input_path = Path::new("resources/csug");
    if !input_path.exists() {
        println!("错误: 输入目录 {} 不存在", input_path.display());
        return Ok(());
    }
    println!("使用输入目录: {}", input_path.display());

    // 列出输入目录中的HTML文件
    println!("输入目录中的HTML文件:");
    for entry in fs::read_dir(input_path)? {
        let entry = entry?;
        let path = entry.path();
        if path.extension().map_or(false, |ext| ext == "html") {
            println!("  {}", path.file_name().unwrap().to_string_lossy());
        }
    }

    // 创建固定的输出目录
    let output_path = "output/csug_gemini";
    let output_dir = Path::new(output_path);
    if !output_dir.exists() {
        fs::create_dir_all(output_dir)?;
        println!("创建输出目录: {}", output_dir.display());
    } else {
        println!("使用已存在的输出目录: {}", output_dir.display());
    }

    // 创建提供商配置 - 使用Gemini
    let html_to_md_config = ProviderConfig::Gemini {
        api_key: api_key.clone(),
        base_url: base_url.clone(),
        temperature: 0.3,
        max_tokens: None,
    };

    let translator_config = ProviderConfig::Gemini {
        api_key,
        base_url,
        temperature: 0.3,
        max_tokens: None,
    };

    // 创建处理器
    println!("创建HTML处理器...");
    let model_name = "gemini-2.5-pro-exp-03-25"; // 使用指定的 Gemini 模型
    println!("使用模型: {}", model_name);

    let processor = create_html_folder_processor(
        html_to_md_config,
        model_name,
        translator_config,
        model_name,
        4, // 并行处理数量
        output_path.to_string(),
    );

    // 执行处理
    println!("开始处理HTML文件...");
    let file_count = processor.run(input_path.to_str().unwrap().to_string(), make_empty_ctx()).await?;

    // 输出结果
    println!("处理完成，共处理了 {} 个文件", file_count);
    println!("结果已保存到: {}", output_path);

    // 列出输出目录中的文件
    let zh_dir = PathBuf::from(output_path).join("zh");
    println!("检查目录: {}", zh_dir.display());

    if zh_dir.exists() {
        let mut file_count = 0;
        for entry in fs::read_dir(&zh_dir)? {
            let entry = entry?;
            println!("输出文件: {}", entry.path().display());
            file_count += 1;

            // 只显示前三个文件的内容
            if file_count <= 3 {
                // 读取并显示文件内容（只显示前 500 个字符）
                let content = fs::read_to_string(entry.path())?;
                let preview = if content.len() > 500 {
                    format!("{} [...]", &content[..500])
                } else {
                    content
                };
                println!("文件内容预览: {}\n", preview);
            }
        }
        println!("共输出 {} 个文件", file_count);
    } else {
        println!("输出目录不存在，可能处理失败");
    }
    Ok(())
}
